/*
 * @Description: redis服务
 * @Author: lihk
 * @Date: 2024-10-11 10:38:26
 */
import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { Redis } from 'ioredis';

@Injectable()
export class RedisService {
  private client: Redis;

  constructor(private configService: ConfigService) {
    const redisHost = this.configService.get<string>('REDIS_HOST');
    const redisPort = this.configService.get<number>('REDIS_PORT');
    const redisPassword = this.configService.get<string>('REDIS_PASSWORD');

    this.client = new Redis({
      host: redisHost,
      port: redisPort,
      password: redisPassword,
    });

    this.client.on('error', (error) => console.error('Redis error:', error));
  }

  /**
   * 异步获取存储在缓存中的值
   * 
   * 该方法通过接收一个键名（key）作为参数，异步地从缓存中检索与该键名关联的值
   * 如果键名存在，并且有关联的值，则返回该值；如果键名不存在，或者没有关联的值，则返回null
   * 
   * @param key 要从缓存中检索值的键名
   * @returns 返回一个Promise，该Promise在检索完成后解析为字符串值或null
   */
  async get(key: string): Promise<string | null> {
    return await this.client.get(key);
  }

  /**
   * 异步设置缓存值
   * @param key 要存储的键名
   * @param value 要存储的值
   * @param expirationInSeconds 过期时间，以秒为单位,默认为1天
   * @returns 返回一个Promise，当Promise解决时，表示值已成功设置
   */
  async set(key: string, value: string, expirationInSeconds: number = 86400): Promise<string> {
    return await this.client.set(key, value, 'EX', expirationInSeconds);
  }
}